home *** CD-ROM | disk | FTP | other *** search
Oberon Document | 1995-08-09 | 5.3 KB | 119 lines | [oODC/obnF] |
- Documents.StdDocumentDesc
- Documents.DocumentDesc
- Containers.ViewDesc
- Views.ViewDesc
- Stores.StoreDesc
- Documents.ModelDesc
- Containers.ModelDesc
- Models.ModelDesc
- Stores.ElemDesc
- TextViews.StdViewDesc
- TextViews.ViewDesc
- TextModels.StdModelDesc
- TextModels.ModelDesc
- TextModels.AttributesDesc
- Helvetica
- Helvetica
- Helvetica
- MODULE ObxControls;
- IMPORT Dialog, Ports, Properties, Views;
- CONST beginner = 0; advanced = 1; expert = 2; guru = 3; (* user classes *)
- TYPE
- Size* = RECORD (Dialog.Enumeration) END; (* customized enumeration *)
- View = POINTER TO RECORD (Views.ViewDesc)
- size: LONGINT (* border size in mm *)
- END;
- data*: RECORD (Dialog.Interactor)
- class*: INTEGER; (* current user class *)
- list*: Size; (* list of currently available sizes, derived from class *)
- width*: LONGINT (* width of next view to be opened. Derived from
- class, or entered through a text entry field *)
- END;
- predef: ARRAY 6 OF LONGINT; (* table of predefined sizes *)
- (* Size *)
- PROCEDURE (VAR s: Size) GetName* (i: LONGINT; VAR name: Dialog.String);
- BEGIN (* return string for a given list entry *)
- IF i = 0 THEN name := "default"
- ELSIF (i = 1) & (data.class >= advanced) THEN name := "small"
- ELSIF (i = 2) & (data.class >= advanced) THEN name := "medium"
- ELSIF (i = 3) & (data.class >= advanced) THEN name := "large"
- ELSIF (i = 4) & (data.class >= expert) THEN name := "tiny"
- ELSIF (i = 5) & (data.class >= expert) THEN name := "huge"
- ELSE name := ""
- END
- END GetName;
- (* View *)
- PROCEDURE (v: View) CopyFrom (source: Views.View);
- BEGIN
- v.size := source(View).size
- END CopyFrom;
- PROCEDURE (v: View) Restore (f: Views.Frame; l, t, r, b: LONGINT);
- BEGIN (* fill view with a red square of size v.size *)
- IF v.size = 0 THEN v.size := predef[0] END; (* lazy initialization of size *)
- f.DrawRect(0, 0, v.size, v.size, Ports.fill, Ports.red)
- END Restore;
- PROCEDURE (v: View) HandlePropMsg (VAR msg: Views.PropMessage);
- BEGIN
- WITH msg: Properties.SizePref DO
- IF v.size = 0 THEN v.size := predef[0] END; (* lazy initialization of size *)
- msg.w := v.size; msg.h := v.size (* tell environment about desired width and height *)
- ELSE (* ignore other messages *)
- END
- END HandlePropMsg;
- (* notifiers *)
- PROCEDURE ClassNotify* (op, from, to: LONGINT);
- BEGIN (* react to change in data.class *)
- IF op = Dialog.changed THEN
- IF (to = beginner) OR (to = advanced) & (data.list.val > 3) THEN
- (* if class is reduced, make sure that selection contains legal elements *)
- data.list.val := 0; data.width := predef[0]; (* modify interactor *)
- Dialog.Update(data) (* redraw controls where necessary *)
- END;
- Dialog.UpdateList(data.list); (* reconstruct list box contents *)
- Dialog.CheckGuards (* reevaluate all control guards *)
- END
- END ClassNotify;
- PROCEDURE ListNotify* (op, from, to: LONGINT);
- BEGIN (* reacto to change in data.list (index to was selected) *)
- IF op = Dialog.changed THEN
- data.width := predef[to]; (* modify interactor *)
- Dialog.Update(data); (* redraw controls where necessary *)
- Dialog.CheckGuards (* reevaluate all control guards *)
- END
- END ListNotify;
- (* guards *)
- PROCEDURE ListGuard* (VAR par: Dialog.Par);
- BEGIN (* disable list box for a beginner *)
- IF data.class = beginner THEN par.disabled := TRUE END
- END ListGuard;
- PROCEDURE WidthGuard* (VAR par: Dialog.Par);
- BEGIN (* make text entry field read-only if user is not guru *)
- IF data.class # guru THEN par.readOnly := TRUE END
- END WidthGuard;
- (* commands *)
- PROCEDURE Open*;
- VAR res: LONGINT; v: View;
- BEGIN
- NEW(v); (* create and initialize a new view *)
- v.size := data.width * Ports.mm; (* define view's size in function of class *)
- Views.OpenAux(v, "Example") (* open the view in a window *)
- END Open;
- BEGIN (* initialization of global variables *)
- predef[0] := 40; predef[1] := 30; predef[2] := 50; (* predefined sizes *)
- predef[3] := 70; predef[4] := 20; predef[5] := 100;
- data.class := beginner; (* default values *)
- data.list.val := 0;
- data.width := predef[0]
- END ObxControls.
- TextControllers.StdCtrlDesc
- TextControllers.ControllerDesc
- Containers.ControllerDesc
- Controllers.ControllerDesc
- TextRulers.StdRulerDesc
- TextRulers.RulerDesc
- TextRulers.StdStyleDesc
- TextRulers.StyleDesc
- TextRulers.AttributesDesc
- Helvetica
- Documents.ControllerDesc
-